package org.example.music;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;
import java.util.List;

/**
 * MusicMapper类继承自TableMapper，用于处理音乐数据的映射任务
 * 它的目的是从HBase表中读取数据，并为每个处理的数据项生成一个键值对
 */
public class MusicMapper extends TableMapper<Text, IntWritable> {
    // 初始化一个常量one，表示每个音乐项将被计数为1
    private final static IntWritable one = new IntWritable(1);

    /**
     * map方法是TableMapper中的核心方法，用于处理数据项并生成键值对
     *
     * @param key     数据项的键，这里使用ImmutableBytesWritable类型
     * @param value   数据项的值，这里是HBase表中的一行结果
     * @param context 上下文对象，用于与Hadoop框架通信，包括写入新的键值对
     * @throws IOException          当写入操作失败时抛出
     * @throws InterruptedException 当任务被中断时抛出
     */
    @Override
    protected void map(ImmutableBytesWritable key, Result value, Mapper<ImmutableBytesWritable, Result, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        // 获取当前行的所有单元格，即列
        List<Cell> cells = value.listCells();
        for (Cell cell : cells) {
            // 对每个单元格，将其值作为键，常量one作为值，写入到上下文中
            context.write(new Text(CellUtil.cloneValue(cell)), one);
        }
    }
}

